package com.nys.conci.base.servicio;

import javax.annotation.PostConstruct;
import javax.ejb.Asynchronous;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import org.apache.log4j.Logger;

/**
 * Clase EJB, con los metodos de logging de errores. Se coloca esta clase como un EJB
 * para utilizar la propiedad de Asincronidad la clase. De esta manera el Logging de errores
 * no afecta el tiempo de respuesta de los metodos. 
 * 
 * La anotacion <code>Asynchronous</code> esta a nivel de la clase, para que todos sus metodos
 * sean asincronos.
 * 
 * @author Adam M. Gamboa González
 */
@Singleton  //Indico que el EJB es singleton
@LocalBean  //Es para login Local
@Startup    //Para indicar que si inicialice el Singleton EJB, cuando se levanta la aplicación.
@Asynchronous
public class ServicioLogger {

    
    private Logger log;
    private Logger logDB;
    
    /**
     * Me inicializa los valores del EJB
     */
    @PostConstruct
    public void inicializar(){
        log = Logger.getLogger("server");
        logDB = Logger.getLogger("database");
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel INFORMACION. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param ex Excepcion a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogInfo(Exception ex, boolean loggingDB) {
        String mensaje = ex.getMessage() != null ? ex.getMessage() : " ";
        if (log != null) {
            if (log.isInfoEnabled()) {
                log.info(mensaje, ex);
            }
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                if (log.isInfoEnabled()) {
                    logDB.info(mensaje);
                }
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel INFORMACION. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param mensaje Mensaje a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogInfo(String mensaje, boolean loggingDB) {
        if (log != null) {
            if (log.isInfoEnabled()) {
                log.info(mensaje);
            }
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                if (log.isInfoEnabled()) {
                    logDB.info(mensaje);
                }
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel DEBUG. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param ex Excepcion a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogDebug(Exception ex, boolean loggingDB) {
        String mensaje = ex.getMessage() != null ? ex.getMessage() : " ";
        if (log != null) {
            if (log.isDebugEnabled()) {
                log.debug(mensaje, ex);
            }
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                
                if (log.isDebugEnabled()) {
                    logDB.debug(mensaje);
                }
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel DEBUG. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param mensaje Mensaje a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogDebug(String mensaje, boolean loggingDB) {
        if (log != null) {
            if (log.isDebugEnabled()) {
                log.debug(mensaje);
            }
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                if (log.isDebugEnabled()) {
                    logDB.debug(mensaje);
                }
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel ERROR. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param ex Excepcion a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogError(Exception ex, boolean loggingDB) {
        String mensaje = ex.getMessage() != null ? ex.getMessage() : " ";
        if (log != null) {
            log.error(mensaje, ex);
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                logDB.error(mensaje);
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel ERROR. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param mensaje Mensaje a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogError(String mensaje, boolean loggingDB) {
        if (log != null) {
            log.error(mensaje);
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                logDB.error(mensaje);
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel FATAL. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param ex Excepcion a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogFatal(Exception ex, boolean loggingDB) {
        String mensaje = ex.getMessage() != null ? ex.getMessage() : " ";
        if (log != null) {
            log.fatal(mensaje, ex);
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                logDB.error(mensaje);
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
    /**
     * Este metodo se encarga de registrar un log de nivel FATAL. Toma el mensaje,
     * a registrar de la excepcion. Si se le indica por medio del parametro <i>loggingDB</i>,
     * registra el mensaje en base de datos. 
     * 
     * @param mensaje Mensaje a registrar en el log.
     * @param loggingDB Indica si desea o no registrar el log en base de datos.
     */
    public void registrarLogFatal(String mensaje, boolean loggingDB) {
        if (log != null) {
            log.fatal(mensaje);
        }

        if ((logDB != null) && (loggingDB)) {
            try {
                logDB.error(mensaje);
            } catch (Exception e) {
                Logger rootLogger = Logger.getRootLogger();
                rootLogger.error("No ha sido posible registrar el log en la base de datos");
            }
        }
    }
    
}
